1. Field of the Invention
The invention relates to locking within a storage controller and in particular relates to locking of flexibly defined regions of storage in a storage subsystem to avoid conflicts when processing multiple requests substantially concurrently.
2. Discussion of Related Art
Storage subsystems have evolved along with associated computing subsystems to improve performance, capacity, and reliability. Redundant arrays of independent disks (i.e., “RAID” subsystems) provide improved performance by utilizing striping features and provide enhanced reliability by adding redundancy information. Performance is enhanced by utilization of so called “striping” features in which one I/O request for reading or writing is distributed over multiple simultaneously active disk drives to thereby spread or distribute the elapsed time waiting for completion over multiple, simultaneously operable disk drives. Redundancy is accomplished in RAID subsystems by adding redundancy information such that the loss/failure of a single disk drive of the plurality of disk drives on which the host data and redundancy information are written will not cause loss of data. Despite the loss of a single disk drive, no data will be lost though in some instances the logical volume will operate in a degraded performance mode.
RAID storage management techniques are known to those skilled in the art by a RAID management level number. The various RAID management techniques are generally referred to as “RAID levels” and have historically been identified by a level number. RAID level 5, for example, utilizes exclusive-OR (“XOR”) parity generation and checking for such redundancy information. Whenever data is to be written to the storage subsystem, the data is “striped” or distributed over a plurality of simultaneously operable disk drives. In addition, XOR parity data (redundancy information) is generated and recorded in conjunction with the supplied data from the write request. In like manner, as data is read from the disk drives, striped information may be read from multiple, simultaneously operable disk drives to thereby reduce the elapsed time overhead required completing a given read request. Still further, if a single drive of the multiple independent disk drives fails, the redundancy information is utilized to continue operation of the associated logical volume containing the failed disk drive. Read operations may be completed by using remaining operable disk drives of the logical volume and computing the exclusive-OR of all blocks of a stripe that remain available to thereby re-generate the missing or lost information from the inoperable disk drive. Such RAID level 5 storage management techniques for striping and XOR parity generation and checking are well known to those of ordinary skill in the art.
Other RAID storage management levels provide still other degrees of improved reliability and/or performance. In addition, a number of high performance storage systems may utilize striping without the need for enhanced reliability afforded by RAID storage management techniques. As used herein, “storage subsystem” or “storage system” refers to all such storage methods and structures where striping and/or RAID storage management techniques are employed.
Typically storage subsystems include a storage controller responsible for managing and coordinating overall operation of the storage subsystem. The storage controller is generally responsible for receiving and processing I/O requests from one or more attached host systems requesting the reading or writing of particular identified information. In addition, the internal architecture of methods operable within the storage controller may frequently generate additional I/O requests. For example, in the context of a RAID level 5 storage subsystem, additional read and write I/O operations may be generated to retrieve and store information associated with the generation and checking of the exclusive-OR parity information managed by the storage controller. In like manner, additional I/O requests may be generated within a storage controller when rebuilding or regenerating a RAID logical volume in response to failure and replacement of one or more storage devices. Still further, other internally generated I/O operations may relate to reorganizing information stored in a volume of a storage subsystem. For example, information may be compacted or defragmented in various manners such that data may be moved from one portion or region of a storage system to another portion or region. Those of ordinary skill in the art will readily recognize a wide variety of operations that may be performed by a storage controller of the storage system that may generate I/O requests internal to the storage controller to be processed substantially concurrently with other internally generated I/O requests and substantially concurrently with ongoing I/O requests received from attached host systems.
When a storage controller is processing such a mixture of I/O requests generated from external sources (e.g., attached host systems) or generated internally to the storage controller, it is necessary for the storage controller to appropriately coordinate the operations to assure integrity of the affected data. One common approach generally known in the art for coordinating such processing is to lock portions of the storage capacity of the storage system to assure temporary exclusive access to affected information. Once temporary exclusive access is granted for processing of one I/O request, other I/O requests may be held in abeyance, queued for later processing, until the current I/O request has completed.
In the past, such locking was performed on large portions of the storage capacity as distinct from small smaller higher granularity portions of a storage system. For example, the entire capacity of a logical volume could be locked while one I/O request is processed to assure that other I/O requests being performed by the storage controller do not interfere. In like manner, but with smaller granularity, where striping of a storage volume is utilized, an entire stripe may be locked during performance of the first I/O request to prevent interference from other I/O requests handled by the storage controller. Heretofore, complexity and performance problems have largely precluded locking at a still smaller levels of granularity. The ability to lock smaller portions (i.e., smaller granularity) of the storage volume capacity allows more parallel processing to be performed by a storage controller. In other words, multiple I/O requests may be handled by a storage controller so long as the affected data does not overlap in a matter to present a conflict resulting in loss of data integrity.
It is evident from the above-described and that a need exists for improved methods and structures to permit locking within a storage controller utilizing more flexibly defined granularity without significantly impacting desired levels of performance.